# @Time : 2020/6/24 13:52
# @Author : Fioman 
# @Phone : 13149920693

"""
容器类型: list,tuple,collections.deque  这些序列可以存放不同类型的数据
扁平类型: str,bytes,bytearray,memoryview,array.array 这些序列只能存放一种数据类型
容器序列存放的是它们说包含的任意类型的对象的引用,而扁平序列存放的是值而不是引用.换句话说,扁平序列其实是一段连续的内存空间.
由此可见扁平序列其实更加紧凑.

序列类型还能按照是否可以修改来分类:
可变序列: list, bytearray, array.array, collections.deque, memoryvview,
不可变序列: tuple,str,bytes
ord()不仅仅是求得的ASCII码,同时也求得了是Unicode码位
"""

# 使用列表推导式的好处
if __name__ == '__main__':
    # 如果是采用普通的方法,将一个字符列表转换为其对应的Unicode码
    symbols = '$¢£¥€¤'
    codes = []
    for s in symbols:
        codes.append(ord(s))
    print("Unicode 码 = {}".format(codes))
    s = "abc"
    # 如果是使用列表推导式,非常的方便,不用写for循环
    codes = [ord(s) for s in symbols]
    print("Unicode 码 = {}".format(codes))
    print("s = {}".format(s))  # 列表推导式里的变量作用域只是在列表推导式内部,不影响外部的同名变量.

    # 列表推导式和filter以及map的比较
    beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]  # for和if结合,这么骚的操作,我靠.
    print("beyond_ascii = {}".format(beyond_ascii))

    # 如果使用filter
    beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols)))
    print("beyond_ascii = {}".format(beyond_ascii))

    # 衣服颜色和尺码的笛卡尔积组合.一个序列和另外一个序列分别组合.然后产生的组合的个数就等于m*n个,这个就是笛卡尔积.

    colors = ["black", "white"]
    sizes = ["S", "M", "L"]
    tshirts = [(color, size) for color in colors for size in sizes]
    print("Tshirts = {}".format(tshirts))

    tshirts = [(color, size) for size in sizes for color in colors]
    print("Tshirts = {}".format(tshirts))

    # 生成器表达式,比列表推导式更好的地方是,生成器表达式可以生成的可迭代序列转换为其他的格式,并且不是一下子生成的.
    codes_tuple = tuple(ord(symbol) for symbol in symbols)
    print("codes_tuple = {}".format(codes_tuple))

    import array

    codes_array = array.array("I", (ord(symbol) for symbol in symbols))
    print("codes_array = {}".format(codes_array))

    # 使用生成器表达式计算笛卡尔积
    for tshirt in ("{} {}".format(c,s) for c in colors for s in sizes):
        print(tshirt)
